home *** CD-ROM | disk | FTP | other *** search
/ Utilities Professional 1-1500 / Utilities Professional 1-1500 (1994)(WPD)[!].iso / 12511500 / var1453.dms / var1453.adf / Hardware / Example2.c < prev    next >
C/C++ Source or Header  |  1992-05-02  |  5KB  |  149 lines

  1. /***********************************************************/
  2. /*                                                         */
  3. /* Amiga C Encyclopedia (ACE) V3.0      Amiga C Club (ACC) */
  4. /* -------------------------------      ------------------ */
  5. /*                                                         */
  6. /* Book:    ACM System                  Amiga C Club       */
  7. /* Chapter: Hardware                    Tulevagen 22       */
  8. /* File:    Example2.c                  181 41  LIDINGO    */
  9. /* Author:  Anders Bjerin               SWEDEN             */
  10. /* Date:    92-05-02                                       */
  11. /* Version: 1.00                                           */
  12. /*                                                         */
  13. /*   Copyright 1992, Anders Bjerin - Amiga C Club (ACC)    */
  14. /*                                                         */
  15. /* Registered members may use this program freely in their */
  16. /*     own commercial/noncommercial programs/articles.     */
  17. /*                                                         */
  18. /***********************************************************/
  19.  
  20. /* This is a very bad program that plays a tune with the    */
  21. /* first audio channel. The reason why it is bad is because */
  22. /* the program does not "lock" the channel before it uses   */
  23. /* the hardware. It simply steals the sound channel without */
  24. /* asking nor notifying anyone.                             */
  25. /*                                                          */
  26. /* If you lock the channel as described in the Audio Device */
  27. /* chapter you may use the hardware registers. However,     */
  28. /* this program does not lock it nor tries to reserve the   */
  29. /* channels as we should. The program is included here only */
  30. /* as a demonstration how the hardware registers are        */
  31. /* working, but should not be used in your own programs!!!  */
  32.  
  33.  
  34.  
  35. #include <exec/types.h>        /* Data types       */
  36. #include <exec/memory.h>       /* Memory types     */
  37. #include <hardware/custom.h>   /* Custom structure */
  38. #include <hardware/dmabits.h>  /* DMA flags        */
  39.  
  40.  
  41.  
  42. /* Length of our waveform: */
  43. #define SQUARE_DATA_LENGTH  2
  44.  
  45.  
  46.  
  47. /* The Custom structure is already declared by the Amiga, and  */
  48. /* should therefore be declared as external data. Since the    */
  49. /* hardware registers could be far away from our program we    */
  50. /* have to declare it as "far". Note that this structure is    */
  51. /* linked to the hardware registers, and if you change any     */
  52. /* fields the corresponding hardware registers are affected.   */
  53. extern struct Custom far custom;
  54.  
  55.  
  56.  
  57. /* Declare a pointer to some soundwave data: */
  58. BYTE *square_wave = NULL;
  59.  
  60.  
  61.  
  62. /* Declare our function: */
  63. void main();
  64. void clean_up( STRPTR text );
  65.  
  66. void main()
  67. {
  68.   /* Temporary loop counter: */
  69.   int loop;
  70.  
  71.  
  72.  
  73.   /* Allocate some memory where we can store the waveform we   */
  74.   /* want to use. Note that it must be Chip memory, and placed */
  75.   /* on a word boundary!                                       */
  76.   square_wave = (BYTE *) AllocMem( SQUARE_DATA_LENGTH, MEMF_CHIP );
  77.   if( !square_wave )
  78.     clean_up( "Could not allocate enough memory for the square wave!" );  
  79.  
  80.   /* Initialize the waveform: (This is the smallest    */
  81.   /* waveform you can use, and undouptly the easiest.) */
  82.   square_wave[ 0 ] = 127;
  83.   square_wave[ 1 ] = -127;
  84.  
  85.   
  86.   
  87.   /* Prepare the hardware registers: (We do not care    */
  88.   /* if anyone else is using these registers. We simply */
  89.   /* overwrite the data in that case. This is VERY BAD! */
  90.   /* Do not do like this in your own programs!!!)       */
  91.  
  92.   /* Give the audio channel a pointer to the wave form: */
  93.   custom.aud[ DMAB_AUD0 ].ac_ptr = (UWORD *) square_wave;;
  94.  
  95.   /* Set the length of the wave form: */
  96.   custom.aud[ DMAB_AUD0 ].ac_len = SQUARE_DATA_LENGTH;
  97.  
  98.   /* Set volume: */
  99.   custom.aud[ DMAB_AUD0 ].ac_vol = 64;
  100.  
  101.   /* Set period value: */
  102.   custom.aud[ DMAB_AUD0 ].ac_per = 256;
  103.  
  104.  
  105.  
  106.  
  107.   /* The first audio channel has now been prepared to play  */
  108.   /* a waveform. We now tell the DMA channel which is       */
  109.   /* connected to the first audio channel to start to play: */ 
  110.   custom.dmacon = DMAF_SETCLR | DMAF_AUD0;
  111.  
  112.  
  113.  
  114.   /* Take a small pause: */
  115.   for( loop=0; loop < 100000; loop++ )
  116.     /* Do nothing... */;
  117.  
  118.  
  119.  
  120.   /* Stop playing the sound: */
  121.   custom.dmacon = DMAF_AUD0;
  122.  
  123.   /* If the DMAF_SETCLR flag is set together with the   */
  124.   /* channel flag, the channel is selected. If you only */
  125.   /* set the channel flag without the DMAF_SETCLR flag, */
  126.   /* the channel is deselected (stopped).               */
  127.  
  128.  
  129.  
  130.   /* Quit: */
  131.   clean_up( "The End!" );
  132. }
  133.  
  134.  
  135.  
  136. void clean_up( STRPTR text )
  137. {
  138.   /* Dealocate the square waveform: */
  139.   if( square_wave )
  140.     FreeMem( square_wave, SQUARE_DATA_LENGTH );
  141.  
  142.   /* Print the last message: */
  143.   printf( "%s\n", text );
  144.  
  145.   /* Quit: */
  146.   exit( 0 );
  147. }
  148.  
  149.